package com.wujian.love.controller;

import com.wujian.love.config.RedisConfig;
import com.wujian.love.service.ICustomerAccountService;
import com.wujian.love.service.impl.CustomerAccountServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RAtomicLong;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.*;

/**
 * @ClassName: RedissonDemoController
 * @Description:
 * @Author: wuj
 * @Date: 2021-01-12 17:08
 **/
@RestController()
@RequestMapping("/redission")
@Slf4j
public class RedissonDemoController {

    @Autowired
    private RedisConfig redisConfig;

    @Autowired
    private ICustomerAccountService customerAccountService;

    private int i = 50;

    /**
     * 线程池
     * corePoolSize:指定了线程池中的线程数量，它的数量决定了添加的任务是开辟新的线程去执行，还是放到workQueue任务队列中去；
     * <p>
     * maximumPoolSize:指定了线程池中的最大线程数量，这个参数会根据你使用的workQueue任务队列的类型，决定线程池会开辟的最大线程数量；
     * <p>
     * keepAliveTime:当线程池中空闲线程数量超过corePoolSize时，多余的线程会在多长时间内被销毁；
     * <p>
     * unit:keepAliveTime的单位
     * <p>
     * workQueue:任务队列，被添加到线程池中，但尚未被执行的任务；它一般分为直接提交队列、有界任务队列、无界任务队列、优先任务队列几种；
     * <p>
     * threadFactory:线程工厂，用于创建线程，一般用默认即可；
     * <p>
     * handler:拒绝策略；当任务太多来不及处理时，如何拒绝任务；
     */


    @GetMapping("/lock")
    public int lockTest() {
        int banlacn = customerAccountService.testLockBanlance();
        System.out.println("最后:" + banlacn);
        return banlacn;
    }


    /**
     * 使用 RAtomicLong 实现 Redis 原子操作
     * RAtomicLong 是 Java 中 AtomicLong 类的分布式“替代品”，
     * 用于在并发环境中保存长值。
     * 以下示例代码演示了 RAtomicLong 的用法：
     */
    @GetMapping("/getAomicLong")
    public void getAomicLong() {
//        RedissonClient client = redisConfig.redissonClient();
//        RAtomicLong atomicLong = client.getAtomicLong("myLong");
//
//        System.out.println("Init value: " + atomicLong.get());
//
//        atomicLong.incrementAndGet();
//        System.out.println("Current value: " + atomicLong.get());
//
//        atomicLong.addAndGet(10L);
//        System.out.println("Final value: " + atomicLong.get());
//
//        client.shutdown();
    }

    public void testRedisSession() {
//        RedissonClient redissonClient = redisConfig.redissonClient();
//
//        RLock rLock = redissonClient.getLock("redisson_demo");
//
//        try {
//
//            rLock.lock();
//        } finally {
//            rLock.unlock();
//        }

    }


}
